{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "import torch\n",
    "\n",
    "from torch import nn\n",
    "\n",
    "\n",
    "class PolicyNetAtt(nn.Module):\n",
    "\n",
    "    def __init__(self,\n",
    "                 input_dim: int,\n",
    "                 policy_dim: int = 2):\n",
    "\n",
    "        super(PolicyNetAtt, self).__init__()\n",
    "\n",
    "        self.num_landmark = int((input_dim - 4) / 3)\n",
    "\n",
    "        self.agent_pos_fc1_pi = nn.Linear(4, 32)\n",
    "        self.agent_pos_fc2_pi = nn.Linear(32, 32)\n",
    "        self.landmark_fc1_pi = nn.Linear(3, 64)\n",
    "        self.landmark_fc2_pi = nn.Linear(64, 32)\n",
    "        self.info_fc1_pi = nn.Linear(64, 64)\n",
    "        self.action_fc1_pi = nn.Linear(64, 64)\n",
    "        self.action_fc2_pi = nn.Linear(64, policy_dim)\n",
    "\n",
    "        self.relu = nn.ReLU()\n",
    "        self.tanh = nn.Tanh()\n",
    "        self.softmax = nn.Softmax(dim=2)\n",
    "        \n",
    "    def forward(self, observation: torch.Tensor) -> torch.Tensor:\n",
    "        if len(observation.size()) == 1:\n",
    "            observation = observation[None, :]\n",
    "\n",
    "        # compute the policy\n",
    "        # embeddings of agent's position  \n",
    "        agent_pos_embedding = self.relu(self.agent_pos_fc1_pi(observation[:, :4]))\n",
    "        agent_pos_embedding = self.relu(self.agent_pos_fc2_pi(agent_pos_embedding))\n",
    "\n",
    "        # embeddings of landmarkss\n",
    "        estimated_landmark_pos = observation[:, 4: 4 + 3 * self.num_landmark]\n",
    "        \n",
    "        #landmark_info = torch.cat((estimated_landmark_pos.reshape(observation.size()[0], self.num_landmark, 2),\n",
    "        #                        info_vector.reshape(observation.size()[0], self.num_landmark, 2)), 2)\n",
    "        \n",
    "        landmark_reshape=estimated_landmark_pos.reshape(observation.size()[0], self.num_landmark, 3)\n",
    "        #landmark_embedding = self.relu(self.landmark_fc1_pi(landmark_info))\n",
    "        \n",
    "        landmark_embedding = self.relu(self.landmark_fc1_pi(landmark_reshape))\n",
    "        landmark_embedding = self.relu(self.landmark_fc2_pi(landmark_embedding))\n",
    "\n",
    "        # attention\n",
    "        landmark_embedding_tr = torch.transpose(landmark_embedding, 1, 2)\n",
    "\n",
    "        # mask\n",
    "        mask = observation[:, - self.num_landmark:].unsqueeze(1)\n",
    "        attention = torch.matmul(agent_pos_embedding.unsqueeze(1), landmark_embedding_tr) / 4\n",
    "        attention = attention.masked_fill(mask == 0, -1e10)\n",
    "\n",
    "        att = self.softmax(attention)\n",
    "        landmark_embedding_att = self.relu((torch.matmul(att, torch.transpose(landmark_embedding_tr, 1, 2)).squeeze(1)))\n",
    "\n",
    "        info_embedding = self.relu(self.info_fc1_pi(torch.cat((agent_pos_embedding, landmark_embedding_att), 1)))\n",
    "        action = self.tanh(self.action_fc1_pi(info_embedding))\n",
    "        action = self.tanh(self.action_fc2_pi(action))\n",
    "\n",
    "        if action.size()[0] == 1:\n",
    "            action = action.flatten()\n",
    "\n",
    "        #scaled_action = torch.hstack(((1 + action[0]) * 2.0, action[1] * torch.pi/3))\n",
    "        scaled_action=action\n",
    "\n",
    "        return scaled_action"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Tensor created on CUDA: tensor([1, 2, 3, 4, 5, 6, 7], device='cuda:0')\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "tensor([-0.0733, -0.1022,  0.0307, -0.1238,  0.0408, -0.0220, -0.0142,  0.1472,\n",
       "        -0.0615,  0.0282, -0.1329,  0.0304,  0.1036,  0.1283,  0.0755,  0.0290,\n",
       "        -0.1109,  0.0482,  0.1083, -0.1016, -0.1074,  0.0377, -0.0839,  0.0180,\n",
       "        -0.1704, -0.1150, -0.0979,  0.0456,  0.0289,  0.1433,  0.0348, -0.0638,\n",
       "         0.0557,  0.0503,  0.0694,  0.0695,  0.1293, -0.0968, -0.0267, -0.1147],\n",
       "       device='cuda:0', grad_fn=<ReshapeAliasBackward0>)"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Check if CUDA is available\n",
    "if torch.cuda.is_available():\n",
    "    device = torch.device(\"cuda\")  # CUDA device object\n",
    "    tensor = torch.tensor([1, 2, 3,4,5,6,7]).to(device)  # Creating a PyTorch tensor on CUDA\n",
    "    print(\"Tensor created on CUDA:\", tensor)\n",
    "else:\n",
    "    print(\"CUDA is not available. Tensor will be created on CPU.\")\n",
    "    tensor = torch.tensor([1, 2, 3])  # Creating a PyTorch tensor on CPU\n",
    "    print(\"Tensor created on CPU:\", tensor)\n",
    "    \n",
    "num_landmarks=128\n",
    "input_dim=128*3+3+3+4\n",
    "tensor=torch.rand(input_dim).to(device)\n",
    "    \n",
    "p=PolicyNetAtt(input_dim=input_dim,policy_dim=2*20)\n",
    "p.to(device)\n",
    "p.forward(tensor)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[1., 0., 0.],\n",
      "        [0., 1., 0.],\n",
      "        [-0., 0., 1.]])\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "torch.Size([3, 3, 128])"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import torch\n",
    "\n",
    "def euler_to_rotation_matrix_zyx(angle_z, angle_y, angle_x):\n",
    "    # Extract the individual angles\n",
    "    #angle_z, angle_y, angle_x = euler_angles\n",
    "\n",
    "    # Compute trigonometric functions for the angles\n",
    "    cos_x, sin_x = torch.cos(angle_x), torch.sin(angle_x)\n",
    "    cos_y, sin_y = torch.cos(angle_y), torch.sin(angle_y)\n",
    "    cos_z, sin_z = torch.cos(angle_z), torch.sin(angle_z)\n",
    "\n",
    "    # Compute the elements of the rotation matrix\n",
    "    R00 = cos_z * cos_y\n",
    "    R01 = cos_z * sin_y * sin_x - sin_z * cos_x\n",
    "    R02 = cos_z * sin_y * cos_x + sin_z * sin_x\n",
    "    R10 = sin_z * cos_y\n",
    "    R11 = sin_z * sin_y * sin_x + cos_z * cos_x\n",
    "    R12 = sin_z * sin_y * cos_x - cos_z * sin_x\n",
    "    R20 = -sin_y\n",
    "    R21 = cos_y * sin_x\n",
    "    R22 = cos_y * cos_x\n",
    "\n",
    "    # Construct the rotation matrix R from the elements\n",
    "    rotation_matrix = torch.stack([torch.stack([R00, R01, R02]),\n",
    "                                   torch.stack([R10, R11, R12]),\n",
    "                                   torch.stack([R20, R21, R22])])\n",
    "\n",
    "    return rotation_matrix\n",
    "\n",
    "# Example usage\n",
    "euler_angles = torch.tensor([0.1, 0.2, 0.3], requires_grad=True)\n",
    "rotation_matrix = euler_to_rotation_matrix_zyx(torch.tensor(0.),torch.tensor(0.),torch.tensor(0.))\n",
    "print(rotation_matrix)\n",
    "\n",
    "\n",
    "\n",
    "angle_z=torch.rand(128).to(device)\n",
    "angle_y=torch.rand(128).to(device)\n",
    "angle_x=torch.rand(128).to(device)\n",
    "\n",
    "euler_to_rotation_matrix_zyx(angle_z,angle_y,angle_z).shape\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "ename": "NameError",
     "evalue": "name 'rodrigues_rotation' is not defined",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mNameError\u001b[0m                                 Traceback (most recent call last)",
      "Cell \u001b[0;32mIn[5], line 34\u001b[0m\n\u001b[1;32m     30\u001b[0m V\u001b[39m=\u001b[39mtorch\u001b[39m.\u001b[39mdiag(torch\u001b[39m.\u001b[39mtensor([\u001b[39m10.\u001b[39m,\u001b[39m1.\u001b[39m,\u001b[39m1.\u001b[39m]))\n\u001b[1;32m     32\u001b[0m unitX\u001b[39m=\u001b[39mtorch\u001b[39m.\u001b[39mtensor([\u001b[39m1.\u001b[39m,\u001b[39m0.\u001b[39m,\u001b[39m0.\u001b[39m])\n\u001b[0;32m---> 34\u001b[0m R\u001b[39m=\u001b[39mrodrigues_rotation(unitX,pc_B[:,\u001b[39m0\u001b[39m])\n\u001b[1;32m     36\u001b[0m V\u001b[39m=\u001b[39mR\u001b[39m.\u001b[39mT\u001b[39m@V\u001b[39m\u001b[39m@R\u001b[39m\n\u001b[1;32m     38\u001b[0m transformed_points\u001b[39m=\u001b[39mcov_to_ellipsoid(V)\n",
      "\u001b[0;31mNameError\u001b[0m: name 'rodrigues_rotation' is not defined"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from mpl_toolkits.mplot3d import Axes3D\n",
    "import torch\n",
    "\n",
    "def cov_to_ellipsoid(V):\n",
    "        # Compute eigenvalues and eigenvectors of V\n",
    "    eigenvalues, eigenvectors = np.linalg.eig(V)\n",
    "\n",
    "    # Generate points on a unit sphere\n",
    "    u = np.linspace(0, 2 * np.pi, 100)\n",
    "    v = np.linspace(0, np.pi, 100)\n",
    "    x = np.outer(np.cos(u), np.sin(v))\n",
    "    y = np.outer(np.sin(u), np.sin(v))\n",
    "    z = np.outer(np.ones_like(u), np.cos(v))\n",
    "    points = np.array([x.flatten(), y.flatten(), z.flatten()])\n",
    "\n",
    "    # Transform the points using eigenvectors and eigenvalues\n",
    "    transformed_points = (eigenvectors @ np.diag(np.sqrt(eigenvalues)) @ points).T\n",
    "    \n",
    "    return transformed_points\n",
    "\n",
    "\n",
    "pc_B=torch.rand([3,128])\n",
    "pc=pc_B\n",
    "pc_range=torch.sqrt(torch.sum(pc**2,axis=0))\n",
    "pc_B=torch.ones([3,1])\n",
    "\n",
    "\n",
    "V=torch.diag(torch.tensor([10.,1.,1.]))\n",
    "\n",
    "unitX=torch.tensor([1.,0.,0.])\n",
    "\n",
    "R=rodrigues_rotation(unitX,pc_B[:,0])\n",
    "\n",
    "V=R.T@V@R\n",
    "\n",
    "transformed_points=cov_to_ellipsoid(V)\n",
    "\n",
    "transformed_points_1=pc_B[:,1]+transformed_points\n",
    "\n",
    "# Plot the ellipsoid\n",
    "fig = plt.figure()\n",
    "ax = fig.add_subplot(111, projection='3d')\n",
    "\n",
    "\n",
    "transformed_points=transformed_points_1\n",
    "ax.plot_surface(transformed_points[:, 0].reshape([100,100]),\n",
    "                transformed_points[:, 1].reshape([100,100]),\n",
    "                transformed_points[:, 2].reshape([100,100]),\n",
    "                alpha=0.5)\n",
    "ax.scatter(0,0,0)\n",
    "\n",
    "\n",
    "ax.set_xlim(-10, 10)\n",
    "ax.set_ylim(-10, 10)\n",
    "ax.set_zlim(-10, 10)\n",
    "# Set axis labels and title\n",
    "ax.set_xlabel('X')\n",
    "ax.set_ylabel('Y')\n",
    "ax.set_zlabel('Z')\n",
    "plt.title('Ellipsoid Visualization')\n",
    "\n",
    "# Show the plot\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "ename": "NameError",
     "evalue": "name 'R_W_C' is not defined",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mNameError\u001b[0m                                 Traceback (most recent call last)",
      "Cell \u001b[0;32mIn[6], line 37\u001b[0m\n\u001b[1;32m     32\u001b[0m \u001b[39m# Create a covariance matrix V\u001b[39;00m\n\u001b[1;32m     33\u001b[0m V \u001b[39m=\u001b[39m np\u001b[39m.\u001b[39marray([[\u001b[39m40\u001b[39m, \u001b[39m0\u001b[39m, \u001b[39m0\u001b[39m],\n\u001b[1;32m     34\u001b[0m               [\u001b[39m0\u001b[39m, \u001b[39m1\u001b[39m, \u001b[39m0\u001b[39m],\n\u001b[1;32m     35\u001b[0m               [\u001b[39m0\u001b[39m, \u001b[39m0\u001b[39m, \u001b[39m1\u001b[39m]])\n\u001b[0;32m---> 37\u001b[0m V\u001b[39m=\u001b[39mR_W_C \u001b[39m@\u001b[39m V \u001b[39m@\u001b[39m R_W_C\u001b[39m.\u001b[39mT\n\u001b[1;32m     38\u001b[0m \u001b[39m# Compute eigenvalues and eigenvectors of V\u001b[39;00m\n\u001b[1;32m     39\u001b[0m eigenvalues, eigenvectors \u001b[39m=\u001b[39m np\u001b[39m.\u001b[39mlinalg\u001b[39m.\u001b[39meig(V)\n",
      "\u001b[0;31mNameError\u001b[0m: name 'R_W_C' is not defined"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from mpl_toolkits.mplot3d import Axes3D\n",
    "\n",
    "\n",
    "import torch\n",
    "\n",
    "def rodrigues_rotation(v1, v2):\n",
    "    # Normalize the input vectors\n",
    "    v1 = v1 / torch.norm(v1)\n",
    "    v2 = v2 / torch.norm(v2)\n",
    "    \n",
    "    # Compute the cross product of the vectors\n",
    "    k = torch.cross(v1, v2)\n",
    "\n",
    "    # Compute the cosine of the angle between the vectors\n",
    "    cos_theta = torch.dot(v1, v2)\n",
    "\n",
    "    # Compute the sine of the angle between the vectors\n",
    "    sin_theta = torch.norm(k)\n",
    "\n",
    "    # Compute the skew-symmetric matrix using the cross product vector\n",
    "    kx = torch.tensor([[0, -k[2], k[1]],\n",
    "                      [k[2], 0, -k[0]],\n",
    "                      [-k[1], k[0], 0]])\n",
    "\n",
    "    # Compute the rotation matrix using Rodrigues' rotation formula\n",
    "    R = torch.eye(3) + kx + torch.mm(kx, kx) * ((1 - cos_theta) / sin_theta**2) if sin_theta != 0 else torch.eye(3)\n",
    "\n",
    "    return R\n",
    "\n",
    "# Create a covariance matrix V\n",
    "V = np.array([[40, 0, 0],\n",
    "              [0, 1, 0],\n",
    "              [0, 0, 1]])\n",
    "\n",
    "V=R_W_C @ V @ R_W_C.T\n",
    "# Compute eigenvalues and eigenvectors of V\n",
    "eigenvalues, eigenvectors = np.linalg.eig(V)\n",
    "\n",
    "# Generate points on a unit sphere\n",
    "u = np.linspace(0, 2 * np.pi, 100)\n",
    "v = np.linspace(0, np.pi, 100)\n",
    "x = np.outer(np.cos(u), np.sin(v))\n",
    "y = np.outer(np.sin(u), np.sin(v))\n",
    "z = np.outer(np.ones_like(u), np.cos(v))\n",
    "points = np.array([x.flatten(), y.flatten(), z.flatten()])\n",
    "\n",
    "# Transform the points using eigenvectors and eigenvalues\n",
    "transformed_points = (eigenvectors @ np.diag(np.sqrt(eigenvalues)) @ points).T\n",
    "transformed_points_1 = (eigenvectors @ np.diag(np.sqrt(eigenvalues)) @ points).T+np.ones([1,3])\n",
    "# Plot the ellipsoid\n",
    "fig = plt.figure()\n",
    "ax = fig.add_subplot(111, projection='3d')\n",
    "ax.plot_surface(transformed_points[:, 0].reshape(x.shape),\n",
    "                transformed_points[:, 1].reshape(x.shape),\n",
    "                transformed_points[:, 2].reshape(x.shape),\n",
    "                alpha=0.5)\n",
    "\n",
    "\n",
    "\n",
    "ax.set_xlim(-10, 10)\n",
    "ax.set_ylim(-10, 10)\n",
    "ax.set_zlim(-10, 10)\n",
    "# Set axis labels and title\n",
    "ax.set_xlabel('X')\n",
    "ax.set_ylabel('Y')\n",
    "ax.set_zlabel('Z')\n",
    "plt.title('Ellipsoid Visualization')\n",
    "\n",
    "# Show the plot\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "\n",
    "def rotation_matrix_from_unitX_to_v(v):\n",
    "    # Normalize the input vector\n",
    "    v = v / np.linalg.norm(v)\n",
    "    \n",
    "    # Calculate the cross product between (1, 0, 0) and v\n",
    "    c = np.cross(np.array([1, 0, 0]), v)\n",
    "\n",
    "    # Calculate the dot product between vectors\n",
    "    dot = np.dot(np.array([1, 0, 0]), v)\n",
    "    \n",
    "\n",
    "    # Define the skew-symmetric matrix of the cross product vector\n",
    "    V = np.array([[0, -c[2], c[1]],\n",
    "                  [c[2], 0, -c[0]],\n",
    "                  [-c[1], c[0], 0]])\n",
    "\n",
    "    # Calculate the rotation matrix using Rodrigues' rotation formula\n",
    "    R = np.eye(3) + V + V @ V * (1 - dot) / (np.linalg.norm(c) ** 2)\n",
    "\n",
    "    return R\n",
    "\n",
    "v=np.array([5,0,-5])\n",
    "\n",
    "R_W_C=rotation_matrix_from_unitX_to_v(v)\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([1.1050, 1.1050, 1.1000, 1.1000])"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import torch\n",
    "import time\n",
    "def rotation_matrix(v):\n",
    "    # Normalize the input vector\n",
    "    v = v / torch.norm(v)\n",
    "    \n",
    "    # Calculate the cross product between (1, 0, 0) and v\n",
    "    c = torch.cross(torch.tensor([1., 0., 0.]), v)\n",
    "\n",
    "    # Calculate the dot product between vectors\n",
    "    dot = torch.dot(torch.tensor([1., 0., 0.]), v)\n",
    "\n",
    "    # Define the skew-symmetric matrix of the cross product vector\n",
    "    V = torch.tensor([[0, -c[2], c[1]],\n",
    "                      [c[2], 0, -c[0]],\n",
    "                      [-c[1], c[0], 0]])\n",
    "\n",
    "    # Calculate the rotation matrix using Rodrigues' rotation formula\n",
    "    R = torch.eye(3) + V + torch.mm(V, V) * (1 - dot) / torch.norm(c) ** 2\n",
    "\n",
    "    return R\n",
    "\n",
    "pc_B=torch.rand([3,128])\n",
    "pc=pc_B\n",
    "pc_range=torch.sqrt(torch.sum(pc**2,axis=0))\n",
    "\n",
    "V=torch.diag(torch.tensor([100.,1.,1.]))\n",
    "\n",
    "\n",
    "M_total=torch.zeros([3,3])\n",
    "\n",
    "t0=time.time()\n",
    "\n",
    "for i in range(pc_B.shape[1]):\n",
    "    d=pc_range[i]\n",
    "    R=rotation_matrix(pc_B[:,i])\n",
    "    M=d*d*R@ V @ R.T\n",
    "    \n",
    "    M_total+=torch.inverse(M)\n",
    "    \n",
    "time.time()-t0\n",
    "\n",
    "\n",
    "def RK4(s, a, dt):\n",
    "    \n",
    "    x0=s[0]\n",
    "    y0=s[1]\n",
    "    vx0=s[2]\n",
    "    vy0=s[3]\n",
    "    \n",
    "    ax=a[0]\n",
    "    ay=a[1]\n",
    "    \n",
    "    k1x = vx0\n",
    "    k1y = vy0\n",
    "    k1vx = ax\n",
    "    k1vy = ay\n",
    "    \n",
    "    k2x = vx0 + k1vx * dt/2\n",
    "    k2y = vy0 + k1vy * dt/2\n",
    "    k2vx = ax\n",
    "    k2vy = ay\n",
    "    \n",
    "    k3x = vx0 + k2vx * dt/2\n",
    "    k3y = vy0 + k2vy * dt/2\n",
    "    k3vx = ax\n",
    "    k3vy = ay\n",
    "    \n",
    "    k4x = vx0 + k3vx * dt\n",
    "    k4y = vy0 + k3vy * dt\n",
    "    k4vx = ax\n",
    "    k4vy = ay\n",
    "    \n",
    "    x1 = x0 + (k1x + 2*k2x + 2*k3x + k4x) * dt/6\n",
    "    y1 = y0 + (k1y + 2*k2y + 2*k3y + k4y) * dt/6\n",
    "    vx1 = vx0 + (k1vx + 2*k2vx + 2*k3vx + k4vx) * dt/6\n",
    "    vy1 = vy0 + (k1vy + 2*k2vy + 2*k3vy + k4vy) * dt/6\n",
    "    \n",
    "    return torch.tensor([x1, y1, vx1, vy1])\n",
    "\n",
    "\n",
    "RK4(s=torch.ones(4),a=torch.ones(2),dt=0.1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor(-0.0101)"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "torch.log(torch.tensor(0.99))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0\n",
      "tensor(-332.0791, grad_fn=<AddBackward0>)\n",
      "1\n",
      "tensor(-340.0066, grad_fn=<AddBackward0>)\n",
      "2\n",
      "tensor(-345.6396, grad_fn=<AddBackward0>)\n",
      "3\n",
      "tensor(-342.4215, grad_fn=<AddBackward0>)\n",
      "4\n"
     ]
    },
    {
     "ename": "KeyboardInterrupt",
     "evalue": "",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mKeyboardInterrupt\u001b[0m                         Traceback (most recent call last)",
      "Cell \u001b[0;32mIn[10], line 205\u001b[0m\n\u001b[1;32m    202\u001b[0m     \u001b[39m#r=torch.norm(action)\u001b[39;00m\n\u001b[1;32m    203\u001b[0m     \u001b[39m#logr=torch.log10(r)\u001b[39;00m\n\u001b[1;32m    204\u001b[0m     r\u001b[39m.\u001b[39mbackward()\n\u001b[0;32m--> 205\u001b[0m     ag\u001b[39m.\u001b[39;49m_policy_optimizer\u001b[39m.\u001b[39;49mstep()\n\u001b[1;32m    207\u001b[0m     r_sum\u001b[39m+\u001b[39m\u001b[39m=\u001b[39mr\n\u001b[1;32m    208\u001b[0m \u001b[39mprint\u001b[39m(r_sum)\n",
      "File \u001b[0;32m~/.local/lib/python3.8/site-packages/torch/optim/optimizer.py:280\u001b[0m, in \u001b[0;36mOptimizer.profile_hook_step.<locals>.wrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m    276\u001b[0m         \u001b[39melse\u001b[39;00m:\n\u001b[1;32m    277\u001b[0m             \u001b[39mraise\u001b[39;00m \u001b[39mRuntimeError\u001b[39;00m(\u001b[39mf\u001b[39m\u001b[39m\"\u001b[39m\u001b[39m{\u001b[39;00mfunc\u001b[39m}\u001b[39;00m\u001b[39m must return None or a tuple of (new_args, new_kwargs),\u001b[39m\u001b[39m\"\u001b[39m\n\u001b[1;32m    278\u001b[0m                                \u001b[39mf\u001b[39m\u001b[39m\"\u001b[39m\u001b[39mbut got \u001b[39m\u001b[39m{\u001b[39;00mresult\u001b[39m}\u001b[39;00m\u001b[39m.\u001b[39m\u001b[39m\"\u001b[39m)\n\u001b[0;32m--> 280\u001b[0m out \u001b[39m=\u001b[39m func(\u001b[39m*\u001b[39;49margs, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkwargs)\n\u001b[1;32m    281\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_optimizer_step_code()\n\u001b[1;32m    283\u001b[0m \u001b[39m# call optimizer step post hooks\u001b[39;00m\n",
      "File \u001b[0;32m~/.local/lib/python3.8/site-packages/torch/optim/optimizer.py:33\u001b[0m, in \u001b[0;36m_use_grad_for_differentiable.<locals>._use_grad\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m     31\u001b[0m \u001b[39mtry\u001b[39;00m:\n\u001b[1;32m     32\u001b[0m     torch\u001b[39m.\u001b[39mset_grad_enabled(\u001b[39mself\u001b[39m\u001b[39m.\u001b[39mdefaults[\u001b[39m'\u001b[39m\u001b[39mdifferentiable\u001b[39m\u001b[39m'\u001b[39m])\n\u001b[0;32m---> 33\u001b[0m     ret \u001b[39m=\u001b[39m func(\u001b[39mself\u001b[39;49m, \u001b[39m*\u001b[39;49margs, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkwargs)\n\u001b[1;32m     34\u001b[0m \u001b[39mfinally\u001b[39;00m:\n\u001b[1;32m     35\u001b[0m     torch\u001b[39m.\u001b[39mset_grad_enabled(prev_grad)\n",
      "File \u001b[0;32m~/.local/lib/python3.8/site-packages/torch/optim/adam.py:141\u001b[0m, in \u001b[0;36mAdam.step\u001b[0;34m(self, closure)\u001b[0m\n\u001b[1;32m    130\u001b[0m     beta1, beta2 \u001b[39m=\u001b[39m group[\u001b[39m'\u001b[39m\u001b[39mbetas\u001b[39m\u001b[39m'\u001b[39m]\n\u001b[1;32m    132\u001b[0m     \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_init_group(\n\u001b[1;32m    133\u001b[0m         group,\n\u001b[1;32m    134\u001b[0m         params_with_grad,\n\u001b[0;32m   (...)\u001b[0m\n\u001b[1;32m    138\u001b[0m         max_exp_avg_sqs,\n\u001b[1;32m    139\u001b[0m         state_steps)\n\u001b[0;32m--> 141\u001b[0m     adam(\n\u001b[1;32m    142\u001b[0m         params_with_grad,\n\u001b[1;32m    143\u001b[0m         grads,\n\u001b[1;32m    144\u001b[0m         exp_avgs,\n\u001b[1;32m    145\u001b[0m         exp_avg_sqs,\n\u001b[1;32m    146\u001b[0m         max_exp_avg_sqs,\n\u001b[1;32m    147\u001b[0m         state_steps,\n\u001b[1;32m    148\u001b[0m         amsgrad\u001b[39m=\u001b[39;49mgroup[\u001b[39m'\u001b[39;49m\u001b[39mamsgrad\u001b[39;49m\u001b[39m'\u001b[39;49m],\n\u001b[1;32m    149\u001b[0m         beta1\u001b[39m=\u001b[39;49mbeta1,\n\u001b[1;32m    150\u001b[0m         beta2\u001b[39m=\u001b[39;49mbeta2,\n\u001b[1;32m    151\u001b[0m         lr\u001b[39m=\u001b[39;49mgroup[\u001b[39m'\u001b[39;49m\u001b[39mlr\u001b[39;49m\u001b[39m'\u001b[39;49m],\n\u001b[1;32m    152\u001b[0m         weight_decay\u001b[39m=\u001b[39;49mgroup[\u001b[39m'\u001b[39;49m\u001b[39mweight_decay\u001b[39;49m\u001b[39m'\u001b[39;49m],\n\u001b[1;32m    153\u001b[0m         eps\u001b[39m=\u001b[39;49mgroup[\u001b[39m'\u001b[39;49m\u001b[39meps\u001b[39;49m\u001b[39m'\u001b[39;49m],\n\u001b[1;32m    154\u001b[0m         maximize\u001b[39m=\u001b[39;49mgroup[\u001b[39m'\u001b[39;49m\u001b[39mmaximize\u001b[39;49m\u001b[39m'\u001b[39;49m],\n\u001b[1;32m    155\u001b[0m         foreach\u001b[39m=\u001b[39;49mgroup[\u001b[39m'\u001b[39;49m\u001b[39mforeach\u001b[39;49m\u001b[39m'\u001b[39;49m],\n\u001b[1;32m    156\u001b[0m         capturable\u001b[39m=\u001b[39;49mgroup[\u001b[39m'\u001b[39;49m\u001b[39mcapturable\u001b[39;49m\u001b[39m'\u001b[39;49m],\n\u001b[1;32m    157\u001b[0m         differentiable\u001b[39m=\u001b[39;49mgroup[\u001b[39m'\u001b[39;49m\u001b[39mdifferentiable\u001b[39;49m\u001b[39m'\u001b[39;49m],\n\u001b[1;32m    158\u001b[0m         fused\u001b[39m=\u001b[39;49mgroup[\u001b[39m'\u001b[39;49m\u001b[39mfused\u001b[39;49m\u001b[39m'\u001b[39;49m],\n\u001b[1;32m    159\u001b[0m         grad_scale\u001b[39m=\u001b[39;49m\u001b[39mgetattr\u001b[39;49m(\u001b[39mself\u001b[39;49m, \u001b[39m\"\u001b[39;49m\u001b[39mgrad_scale\u001b[39;49m\u001b[39m\"\u001b[39;49m, \u001b[39mNone\u001b[39;49;00m),\n\u001b[1;32m    160\u001b[0m         found_inf\u001b[39m=\u001b[39;49m\u001b[39mgetattr\u001b[39;49m(\u001b[39mself\u001b[39;49m, \u001b[39m\"\u001b[39;49m\u001b[39mfound_inf\u001b[39;49m\u001b[39m\"\u001b[39;49m, \u001b[39mNone\u001b[39;49;00m),\n\u001b[1;32m    161\u001b[0m     )\n\u001b[1;32m    163\u001b[0m \u001b[39mreturn\u001b[39;00m loss\n",
      "File \u001b[0;32m~/.local/lib/python3.8/site-packages/torch/optim/adam.py:281\u001b[0m, in \u001b[0;36madam\u001b[0;34m(params, grads, exp_avgs, exp_avg_sqs, max_exp_avg_sqs, state_steps, foreach, capturable, differentiable, fused, grad_scale, found_inf, amsgrad, beta1, beta2, lr, weight_decay, eps, maximize)\u001b[0m\n\u001b[1;32m    278\u001b[0m \u001b[39melse\u001b[39;00m:\n\u001b[1;32m    279\u001b[0m     func \u001b[39m=\u001b[39m _single_tensor_adam\n\u001b[0;32m--> 281\u001b[0m func(params,\n\u001b[1;32m    282\u001b[0m      grads,\n\u001b[1;32m    283\u001b[0m      exp_avgs,\n\u001b[1;32m    284\u001b[0m      exp_avg_sqs,\n\u001b[1;32m    285\u001b[0m      max_exp_avg_sqs,\n\u001b[1;32m    286\u001b[0m      state_steps,\n\u001b[1;32m    287\u001b[0m      amsgrad\u001b[39m=\u001b[39;49mamsgrad,\n\u001b[1;32m    288\u001b[0m      beta1\u001b[39m=\u001b[39;49mbeta1,\n\u001b[1;32m    289\u001b[0m      beta2\u001b[39m=\u001b[39;49mbeta2,\n\u001b[1;32m    290\u001b[0m      lr\u001b[39m=\u001b[39;49mlr,\n\u001b[1;32m    291\u001b[0m      weight_decay\u001b[39m=\u001b[39;49mweight_decay,\n\u001b[1;32m    292\u001b[0m      eps\u001b[39m=\u001b[39;49meps,\n\u001b[1;32m    293\u001b[0m      maximize\u001b[39m=\u001b[39;49mmaximize,\n\u001b[1;32m    294\u001b[0m      capturable\u001b[39m=\u001b[39;49mcapturable,\n\u001b[1;32m    295\u001b[0m      differentiable\u001b[39m=\u001b[39;49mdifferentiable,\n\u001b[1;32m    296\u001b[0m      grad_scale\u001b[39m=\u001b[39;49mgrad_scale,\n\u001b[1;32m    297\u001b[0m      found_inf\u001b[39m=\u001b[39;49mfound_inf)\n",
      "File \u001b[0;32m~/.local/lib/python3.8/site-packages/torch/optim/adam.py:391\u001b[0m, in \u001b[0;36m_single_tensor_adam\u001b[0;34m(params, grads, exp_avgs, exp_avg_sqs, max_exp_avg_sqs, state_steps, grad_scale, found_inf, amsgrad, beta1, beta2, lr, weight_decay, eps, maximize, capturable, differentiable)\u001b[0m\n\u001b[1;32m    389\u001b[0m     denom \u001b[39m=\u001b[39m (max_exp_avg_sqs[i]\u001b[39m.\u001b[39msqrt() \u001b[39m/\u001b[39m bias_correction2_sqrt)\u001b[39m.\u001b[39madd_(eps)\n\u001b[1;32m    390\u001b[0m \u001b[39melse\u001b[39;00m:\n\u001b[0;32m--> 391\u001b[0m     denom \u001b[39m=\u001b[39m (exp_avg_sq\u001b[39m.\u001b[39;49msqrt() \u001b[39m/\u001b[39;49m bias_correction2_sqrt)\u001b[39m.\u001b[39madd_(eps)\n\u001b[1;32m    393\u001b[0m param\u001b[39m.\u001b[39maddcdiv_(exp_avg, denom, value\u001b[39m=\u001b[39m\u001b[39m-\u001b[39mstep_size)\n",
      "\u001b[0;31mKeyboardInterrupt\u001b[0m: "
     ]
    }
   ],
   "source": [
    "from torch.optim import SGD, Adam\n",
    "from pytorch3d.transforms import Rotate, Translate,euler_angles_to_matrix\n",
    "import torch\n",
    "from torch import nn\n",
    "\n",
    "\n",
    "def euler_to_rotation_matrix_zyx(angle_z, angle_y, angle_x):\n",
    "    # Extract the individual angles\n",
    "    #angle_z, angle_y, angle_x = euler_angles\n",
    "\n",
    "    # Compute trigonometric functions for the angles\n",
    "    cos_x, sin_x = torch.cos(angle_x), torch.sin(angle_x)\n",
    "    cos_y, sin_y = torch.cos(angle_y), torch.sin(angle_y)\n",
    "    cos_z, sin_z = torch.cos(angle_z), torch.sin(angle_z)\n",
    "\n",
    "    # Compute the elements of the rotation matrix\n",
    "    R00 = cos_z * cos_y\n",
    "    R01 = cos_z * sin_y * sin_x - sin_z * cos_x\n",
    "    R02 = cos_z * sin_y * cos_x + sin_z * sin_x\n",
    "    R10 = sin_z * cos_y\n",
    "    R11 = sin_z * sin_y * sin_x + cos_z * cos_x\n",
    "    R12 = sin_z * sin_y * cos_x - cos_z * sin_x\n",
    "    R20 = -sin_y\n",
    "    R21 = cos_y * sin_x\n",
    "    R22 = cos_y * cos_x\n",
    "\n",
    "    # Construct the rotation matrix R from the elements\n",
    "    rotation_matrix = torch.stack([torch.stack([R00, R01, R02]),\n",
    "                                   torch.stack([R10, R11, R12]),\n",
    "                                   torch.stack([R20, R21, R22])])\n",
    "\n",
    "    return rotation_matrix\n",
    "\n",
    "class PolicyNetAtt(nn.Module):\n",
    "\n",
    "    def __init__(self,\n",
    "                 input_dim: int,\n",
    "                 policy_dim: int = 2):\n",
    "\n",
    "        super(PolicyNetAtt, self).__init__()\n",
    "\n",
    "        self.num_landmark = int((input_dim - 4) / 3)\n",
    "\n",
    "        self.agent_pos_fc1_pi = nn.Linear(4, 32)\n",
    "        self.agent_pos_fc2_pi = nn.Linear(32, 32)\n",
    "        self.landmark_fc1_pi = nn.Linear(3, 64)\n",
    "        self.landmark_fc2_pi = nn.Linear(64, 32)\n",
    "        self.info_fc1_pi = nn.Linear(64, 64)\n",
    "        self.action_fc1_pi = nn.Linear(64, 64)\n",
    "        self.action_fc2_pi = nn.Linear(64, policy_dim)\n",
    "\n",
    "        self.relu = nn.ReLU()\n",
    "        self.tanh = nn.Tanh()\n",
    "        self.softmax = nn.Softmax(dim=2)\n",
    "        \n",
    "    def forward(self, observation: torch.Tensor) -> torch.Tensor:\n",
    "        if len(observation.size()) == 1:\n",
    "            observation = observation[None, :]\n",
    "\n",
    "        # compute the policy\n",
    "        # embeddings of agent's position  \n",
    "        agent_pos_embedding = self.relu(self.agent_pos_fc1_pi(observation[:, :4]))\n",
    "        agent_pos_embedding = self.relu(self.agent_pos_fc2_pi(agent_pos_embedding))\n",
    "\n",
    "        # embeddings of landmarkss\n",
    "        estimated_landmark_pos = observation[:, 4: 4 + 3 * self.num_landmark]\n",
    "        \n",
    "        #landmark_info = torch.cat((estimated_landmark_pos.reshape(observation.size()[0], self.num_landmark, 2),\n",
    "        #                        info_vector.reshape(observation.size()[0], self.num_landmark, 2)), 2)\n",
    "        \n",
    "        landmark_reshape=estimated_landmark_pos.reshape(observation.size()[0], self.num_landmark, 3)\n",
    "        #landmark_embedding = self.relu(self.landmark_fc1_pi(landmark_info))\n",
    "        \n",
    "        landmark_embedding = self.relu(self.landmark_fc1_pi(landmark_reshape))\n",
    "        landmark_embedding = self.relu(self.landmark_fc2_pi(landmark_embedding))\n",
    "\n",
    "        # attention\n",
    "        landmark_embedding_tr = torch.transpose(landmark_embedding, 1, 2)\n",
    "\n",
    "        # mask\n",
    "        mask = observation[:, - self.num_landmark:].unsqueeze(1)\n",
    "        attention = torch.matmul(agent_pos_embedding.unsqueeze(1), landmark_embedding_tr) / 4\n",
    "        attention = attention.masked_fill(mask == 0, -1e10)\n",
    "\n",
    "        att = self.softmax(attention)\n",
    "        landmark_embedding_att = self.relu((torch.matmul(att, torch.transpose(landmark_embedding_tr, 1, 2)).squeeze(1)))\n",
    "\n",
    "        info_embedding = self.relu(self.info_fc1_pi(torch.cat((agent_pos_embedding, landmark_embedding_att), 1)))\n",
    "        action = self.tanh(self.action_fc1_pi(info_embedding))\n",
    "        action = self.tanh(self.action_fc2_pi(action))\n",
    "\n",
    "        if action.size()[0] == 1:\n",
    "            action = action.flatten()\n",
    "\n",
    "        #scaled_action = torch.hstack(((1 + action[0]) * 2.0, action[1] * torch.pi/3))\n",
    "        scaled_action=action\n",
    "\n",
    "        return scaled_action\n",
    "\n",
    "\n",
    "class Agent:\n",
    "    \n",
    "    def __init__(self,s=torch.zeros([4]),p_b=torch.zeros([3]),p_T=torch.ones([3]),max_num_landmarks=128,fov=torch.pi/2,lr=1e-6):\n",
    "        self._s=s\n",
    "        self._p_b=p_b\n",
    "        self._p_T=p_T\n",
    "        self._max_num_landmarks=max_num_landmarks\n",
    "        self._num_landmarks=torch.randint(low=1, high=self._max_num_landmarks, size=(1,)).item()\n",
    "        self._p_f_W=torch.ones([3,self._num_landmarks]) #feature position in world frame\n",
    "        \n",
    "        self._V_flatten=torch.tensor([100.,1.,1.])\n",
    "        self._V=torch.diag(self._V_flatten)\n",
    "        self._V_inv=torch.diag(1/self._V_flatten)\n",
    "        \n",
    "        #self._R_W_C=zy_rotation_matrix(angle_z=self._s[0],angle_y=self._s[1]) # camera pose in World frame\n",
    "        self._input_dim=max_num_landmarks*3+3+3+4\n",
    "        self._fov=fov\n",
    "        \n",
    "        self._policy=PolicyNetAtt(input_dim=self._input_dim)\n",
    "        self._policy_optimizer=Adam(self._policy.parameters(), lr=lr)\n",
    "        self.loss=0.\n",
    "    \n",
    "    def update_rotation_matrix(self):\n",
    "        self._R_W_C=euler_to_rotation_matrix_zyx(self._s[0],self._s[1],torch.tensor(0.0))\n",
    "    \n",
    "    \n",
    "    def calculate_visibility(self,a,bearing):\n",
    "        a_vis=torch.tensor(a)\n",
    "        v=1/(1+torch.exp(-a_vis*torch.cos(bearing*torch.pi/self._fov)))#*(1+torch.exp(-torch.tensor(a_vis)))\n",
    "        v_max=1/(1+torch.exp(-a_vis))\n",
    "        v_min=1/(1+torch.exp(a_vis))\n",
    "        \n",
    "        v_normalized=(v-v_min)/(v_max-v_min)\n",
    "        return v_normalized\n",
    "        \n",
    "    def calculate_target_visiblity(self):\n",
    "        p_T_C=self._R_W_C.T @ self._p_T\n",
    "        bear_T=torch.acos(p_T_C[0]/torch.norm(p_T_C))\n",
    "        vis_T=self.calculate_visibility(1.,bear_T)\n",
    "        \n",
    "        return vis_T\n",
    "    \n",
    "    def calculate_FIM(self):\n",
    "        p_f_C=self._R_W_C.T @ self._p_f_W\n",
    "        \n",
    "        M_total=torch.zeros([3,3])\n",
    "        for i in range(self._num_landmarks):\n",
    "            v_f_C=p_f_C[:,i]\n",
    "            dis_f=torch.norm(v_f_C)\n",
    "            x_f=v_f_C[0]\n",
    "            bear_f=torch.acos(x_f/dis_f)\n",
    "            vis_f=self.calculate_visibility(44.,bear_f)\n",
    "            #print(v)\n",
    "            unitX=torch.tensor([1.,0.,0.])\n",
    "            R=rodrigues_rotation(unitX,v_f_C)\n",
    "            \n",
    "            M=vis_f*(R.T@self._V_inv@R)/dis_f/dis_f\n",
    "            M_total+=M\n",
    "            \n",
    "        return M_total\n",
    "    \n",
    "    def plan(self,s,p_b,p_T,p_f):\n",
    "        padding=torch.zeros(3*(self._max_num_landmarks-p_f.shape[1]))\n",
    "\n",
    "        \n",
    "        mask=torch.tensor([True]*p_f.shape[1]+[False]*(self._max_num_landmarks-p_f.shape[1]))\n",
    "        net_input=torch.hstack([s,p_b,p_T,p_f.flatten(),padding,mask])\n",
    "        action=self._policy.forward(net_input)\n",
    "        \n",
    "        return action        \n",
    "    \n",
    "    \n",
    "    \n",
    "ag=Agent()\n",
    "ag._policy.train()\n",
    "#ag._policy.load_state_dict(torch.load('./checkpoints/model_info_5_moving_landmarks_2.pth'))\n",
    "batch_size=1000\n",
    "r_list=[]\n",
    "for i in range(300):\n",
    "    print(i)\n",
    "    r_sum=torch.tensor(0.0)\n",
    "    for j in range(batch_size):\n",
    "        #ag.calculate_FIM()\n",
    "        ag._s=torch.rand(4)\n",
    "        ag._p_T=torch.rand(3)\n",
    "        action=ag.plan(ag._s,ag._p_b,ag._p_T,ag._p_f_W)\n",
    "    \n",
    "        #rk4\n",
    "        dt=5.0\n",
    "        x=ag._s\n",
    "        xdot=torch.hstack([ag._s[2:],action])\n",
    "\n",
    "        k1=xdot\n",
    "        k2=xdot+torch.hstack([k1[2:]*dt/2,torch.zeros(2)])\n",
    "        k3=xdot+torch.hstack([k2[2:]*dt/2,torch.zeros(2)])\n",
    "        k4=xdot+torch.hstack([k3[2:]*dt,torch.zeros(2)])\n",
    "        ag._s=ag._s+(k1+2*k2+2*k3+k4)*dt/6\n",
    "\n",
    "        ag.update_rotation_matrix()\n",
    "        \n",
    "        r=-(ag.calculate_target_visiblity())\n",
    "        #r=torch.norm(action)\n",
    "        #logr=torch.log10(r)\n",
    "        r.backward()\n",
    "        ag._policy_optimizer.step()\n",
    "        \n",
    "        r_sum+=r\n",
    "    print(r_sum)\n",
    "    torch.save(ag._policy.state_dict(), './checkpoints/model_info_5_moving_landmarks_2.pth')\n",
    "    r_list.append(r_sum)\n",
    "    #print(r)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0\n",
      "tensor(-225.9043, grad_fn=<AddBackward0>)\n",
      "1\n",
      "tensor(-204.4440, grad_fn=<AddBackward0>)\n",
      "2\n",
      "tensor(-217.8994, grad_fn=<AddBackward0>)\n",
      "3\n",
      "tensor(-211.6789, grad_fn=<AddBackward0>)\n",
      "4\n",
      "tensor(-211.9273, grad_fn=<AddBackward0>)\n",
      "5\n",
      "tensor(-218.9276, grad_fn=<AddBackward0>)\n",
      "6\n",
      "tensor(-207.8056, grad_fn=<AddBackward0>)\n",
      "7\n",
      "tensor(-241.6618, grad_fn=<AddBackward0>)\n",
      "8\n",
      "tensor(-223.1467, grad_fn=<AddBackward0>)\n",
      "9\n",
      "tensor(-218.4805, grad_fn=<AddBackward0>)\n",
      "10\n",
      "tensor(-231.7758, grad_fn=<AddBackward0>)\n",
      "11\n",
      "tensor(-215.0314, grad_fn=<AddBackward0>)\n",
      "12\n",
      "tensor(-215.2984, grad_fn=<AddBackward0>)\n",
      "13\n",
      "tensor(-207.3643, grad_fn=<AddBackward0>)\n",
      "14\n",
      "tensor(-217.2799, grad_fn=<AddBackward0>)\n",
      "15\n",
      "tensor(-219.5397, grad_fn=<AddBackward0>)\n",
      "16\n",
      "tensor(-221.2545, grad_fn=<AddBackward0>)\n",
      "17\n",
      "tensor(-205.9471, grad_fn=<AddBackward0>)\n",
      "18\n",
      "tensor(-219.4542, grad_fn=<AddBackward0>)\n",
      "19\n",
      "tensor(-215.2574, grad_fn=<AddBackward0>)\n",
      "20\n",
      "tensor(-213.1669, grad_fn=<AddBackward0>)\n",
      "21\n",
      "tensor(-217.9136, grad_fn=<AddBackward0>)\n",
      "22\n",
      "tensor(-225.7941, grad_fn=<AddBackward0>)\n",
      "23\n",
      "tensor(-227.5434, grad_fn=<AddBackward0>)\n",
      "24\n",
      "tensor(-214.1789, grad_fn=<AddBackward0>)\n",
      "25\n",
      "tensor(-216.9601, grad_fn=<AddBackward0>)\n",
      "26\n",
      "tensor(-218.8406, grad_fn=<AddBackward0>)\n",
      "27\n",
      "tensor(-225.4908, grad_fn=<AddBackward0>)\n",
      "28\n",
      "tensor(-230.3950, grad_fn=<AddBackward0>)\n",
      "29\n",
      "tensor(-222.1103, grad_fn=<AddBackward0>)\n",
      "30\n",
      "tensor(-224.1569, grad_fn=<AddBackward0>)\n",
      "31\n",
      "tensor(-224.2938, grad_fn=<AddBackward0>)\n",
      "32\n",
      "tensor(-221.4064, grad_fn=<AddBackward0>)\n",
      "33\n",
      "tensor(-226.3284, grad_fn=<AddBackward0>)\n",
      "34\n",
      "tensor(-204.3759, grad_fn=<AddBackward0>)\n",
      "35\n",
      "tensor(-208.9274, grad_fn=<AddBackward0>)\n",
      "36\n",
      "tensor(-218.5627, grad_fn=<AddBackward0>)\n",
      "37\n",
      "tensor(-229.0637, grad_fn=<AddBackward0>)\n",
      "38\n",
      "tensor(-211.3383, grad_fn=<AddBackward0>)\n",
      "39\n",
      "tensor(-211.4280, grad_fn=<AddBackward0>)\n",
      "40\n",
      "tensor(-219.3439, grad_fn=<AddBackward0>)\n",
      "41\n",
      "tensor(-226.5061, grad_fn=<AddBackward0>)\n",
      "42\n",
      "tensor(-213.8121, grad_fn=<AddBackward0>)\n",
      "43\n",
      "tensor(-204.3746, grad_fn=<AddBackward0>)\n",
      "44\n",
      "tensor(-216.4233, grad_fn=<AddBackward0>)\n",
      "45\n",
      "tensor(-213.9009, grad_fn=<AddBackward0>)\n",
      "46\n",
      "tensor(-216.1405, grad_fn=<AddBackward0>)\n",
      "47\n",
      "tensor(-214.2080, grad_fn=<AddBackward0>)\n",
      "48\n",
      "tensor(-222.3643, grad_fn=<AddBackward0>)\n",
      "49\n",
      "tensor(-228.7699, grad_fn=<AddBackward0>)\n",
      "50\n",
      "tensor(-214.9547, grad_fn=<AddBackward0>)\n",
      "51\n",
      "tensor(-203.6637, grad_fn=<AddBackward0>)\n",
      "52\n",
      "tensor(-232.5916, grad_fn=<AddBackward0>)\n",
      "53\n",
      "tensor(-222.6666, grad_fn=<AddBackward0>)\n",
      "54\n",
      "tensor(-215.3814, grad_fn=<AddBackward0>)\n",
      "55\n",
      "tensor(-222.0315, grad_fn=<AddBackward0>)\n",
      "56\n",
      "tensor(-216.5827, grad_fn=<AddBackward0>)\n",
      "57\n",
      "tensor(-234.3913, grad_fn=<AddBackward0>)\n",
      "58\n",
      "tensor(-218.5443, grad_fn=<AddBackward0>)\n",
      "59\n",
      "tensor(-227.4328, grad_fn=<AddBackward0>)\n",
      "60\n",
      "tensor(-218.5013, grad_fn=<AddBackward0>)\n",
      "61\n",
      "tensor(-217.4509, grad_fn=<AddBackward0>)\n",
      "62\n",
      "tensor(-221.8369, grad_fn=<AddBackward0>)\n",
      "63\n",
      "tensor(-229.5822, grad_fn=<AddBackward0>)\n",
      "64\n",
      "tensor(-234.6888, grad_fn=<AddBackward0>)\n",
      "65\n"
     ]
    },
    {
     "ename": "KeyboardInterrupt",
     "evalue": "",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mKeyboardInterrupt\u001b[0m                         Traceback (most recent call last)",
      "Cell \u001b[0;32mIn[11], line 37\u001b[0m\n\u001b[1;32m     34\u001b[0m r\u001b[39m=\u001b[39m\u001b[39m-\u001b[39m(ag\u001b[39m.\u001b[39mcalculate_target_visiblity())\n\u001b[1;32m     35\u001b[0m \u001b[39m#r=torch.norm(action)\u001b[39;00m\n\u001b[1;32m     36\u001b[0m \u001b[39m#logr=torch.log10(r)\u001b[39;00m\n\u001b[0;32m---> 37\u001b[0m r\u001b[39m.\u001b[39;49mbackward()\n\u001b[1;32m     38\u001b[0m ag\u001b[39m.\u001b[39m_policy_optimizer\u001b[39m.\u001b[39mstep()\n\u001b[1;32m     40\u001b[0m r_sum\u001b[39m+\u001b[39m\u001b[39m=\u001b[39mr\n",
      "File \u001b[0;32m~/.local/lib/python3.8/site-packages/torch/_tensor.py:487\u001b[0m, in \u001b[0;36mTensor.backward\u001b[0;34m(self, gradient, retain_graph, create_graph, inputs)\u001b[0m\n\u001b[1;32m    477\u001b[0m \u001b[39mif\u001b[39;00m has_torch_function_unary(\u001b[39mself\u001b[39m):\n\u001b[1;32m    478\u001b[0m     \u001b[39mreturn\u001b[39;00m handle_torch_function(\n\u001b[1;32m    479\u001b[0m         Tensor\u001b[39m.\u001b[39mbackward,\n\u001b[1;32m    480\u001b[0m         (\u001b[39mself\u001b[39m,),\n\u001b[0;32m   (...)\u001b[0m\n\u001b[1;32m    485\u001b[0m         inputs\u001b[39m=\u001b[39minputs,\n\u001b[1;32m    486\u001b[0m     )\n\u001b[0;32m--> 487\u001b[0m torch\u001b[39m.\u001b[39;49mautograd\u001b[39m.\u001b[39;49mbackward(\n\u001b[1;32m    488\u001b[0m     \u001b[39mself\u001b[39;49m, gradient, retain_graph, create_graph, inputs\u001b[39m=\u001b[39;49minputs\n\u001b[1;32m    489\u001b[0m )\n",
      "File \u001b[0;32m~/.local/lib/python3.8/site-packages/torch/autograd/__init__.py:200\u001b[0m, in \u001b[0;36mbackward\u001b[0;34m(tensors, grad_tensors, retain_graph, create_graph, grad_variables, inputs)\u001b[0m\n\u001b[1;32m    195\u001b[0m     retain_graph \u001b[39m=\u001b[39m create_graph\n\u001b[1;32m    197\u001b[0m \u001b[39m# The reason we repeat same the comment below is that\u001b[39;00m\n\u001b[1;32m    198\u001b[0m \u001b[39m# some Python versions print out the first line of a multi-line function\u001b[39;00m\n\u001b[1;32m    199\u001b[0m \u001b[39m# calls in the traceback and some print out the last line\u001b[39;00m\n\u001b[0;32m--> 200\u001b[0m Variable\u001b[39m.\u001b[39;49m_execution_engine\u001b[39m.\u001b[39;49mrun_backward(  \u001b[39m# Calls into the C++ engine to run the backward pass\u001b[39;49;00m\n\u001b[1;32m    201\u001b[0m     tensors, grad_tensors_, retain_graph, create_graph, inputs,\n\u001b[1;32m    202\u001b[0m     allow_unreachable\u001b[39m=\u001b[39;49m\u001b[39mTrue\u001b[39;49;00m, accumulate_grad\u001b[39m=\u001b[39;49m\u001b[39mTrue\u001b[39;49;00m)\n",
      "\u001b[0;31mKeyboardInterrupt\u001b[0m: "
     ]
    }
   ],
   "source": [
    "    \n",
    "    \n",
    "ag=Agent()\n",
    "ag._policy.train()\n",
    "ag._policy.load_state_dict(torch.load('./checkpoints/model_info_5_moving_landmarks_2.pth'))\n",
    "batch_size=1000\n",
    "r_list=[]\n",
    "for i in range(300):\n",
    "    print(i)\n",
    "    r_sum=torch.tensor(0.0)\n",
    "    for j in range(batch_size):\n",
    "        #ag.calculate_FIM()\n",
    "        random_tensor=torch.randint(0,2,(1,4))*2-1\n",
    "        ag._s=(torch.rand(4))#*random_tensor)[0]\n",
    "        \n",
    "        random_tensor=torch.vstack([torch.tensor(1),(torch.randint(0,2,(2,1))*2-1)])\n",
    "        ag._p_T=(torch.rand(3))#*random_tensor.T)[0]\n",
    "        \n",
    "        \n",
    "        \n",
    "        action=ag.plan(ag._s,ag._p_b,ag._p_T,ag._p_f_W)\n",
    "    \n",
    "        #rk4\n",
    "        dt=0.1\n",
    "        x=ag._s\n",
    "        xdot=torch.hstack([ag._s[2:],action])\n",
    "\n",
    "        k1=xdot\n",
    "        k2=xdot+torch.hstack([k1[2:]*dt/2,torch.zeros(2)])\n",
    "        k3=xdot+torch.hstack([k2[2:]*dt/2,torch.zeros(2)])\n",
    "        k4=xdot+torch.hstack([k3[2:]*dt,torch.zeros(2)])\n",
    "        ag._s=ag._s+(k1+2*k2+2*k3+k4)*dt/6\n",
    "\n",
    "        ag.update_rotation_matrix()\n",
    "        \n",
    "        r=-(ag.calculate_target_visiblity())\n",
    "        #r=torch.norm(action)\n",
    "        #logr=torch.log10(r)\n",
    "        r.backward()\n",
    "        ag._policy_optimizer.step()\n",
    "        \n",
    "        r_sum+=r\n",
    "    print(r_sum)\n",
    "    torch.save(ag._policy.state_dict(), './checkpoints/model_info_5_moving_landmarks_2.pth')\n",
    "    r_list.append(r_sum)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0\n",
      "tensor(-783.5200, grad_fn=<AddBackward0>)\n",
      "1\n",
      "tensor(-739.0698, grad_fn=<AddBackward0>)\n",
      "2\n",
      "tensor(-710.2677, grad_fn=<AddBackward0>)\n",
      "3\n",
      "tensor(-754.3502, grad_fn=<AddBackward0>)\n",
      "4\n",
      "tensor(-782.3976, grad_fn=<AddBackward0>)\n",
      "5\n",
      "tensor(-722.8613, grad_fn=<AddBackward0>)\n",
      "6\n",
      "tensor(-726.1169, grad_fn=<AddBackward0>)\n",
      "7\n",
      "tensor(-784.8926, grad_fn=<AddBackward0>)\n",
      "8\n",
      "tensor(-739.5903, grad_fn=<AddBackward0>)\n",
      "9\n",
      "tensor(-749.4243, grad_fn=<AddBackward0>)\n",
      "10\n",
      "tensor(-789.9659, grad_fn=<AddBackward0>)\n",
      "11\n",
      "tensor(-762.4294, grad_fn=<AddBackward0>)\n",
      "12\n",
      "tensor(-773.0265, grad_fn=<AddBackward0>)\n",
      "13\n",
      "tensor(-783.3139, grad_fn=<AddBackward0>)\n",
      "14\n",
      "tensor(-762.9214, grad_fn=<AddBackward0>)\n",
      "15\n",
      "tensor(-773.8637, grad_fn=<AddBackward0>)\n",
      "16\n",
      "tensor(-763.8563, grad_fn=<AddBackward0>)\n",
      "17\n",
      "tensor(-742.1221, grad_fn=<AddBackward0>)\n",
      "18\n",
      "tensor(-768.1526, grad_fn=<AddBackward0>)\n",
      "19\n",
      "tensor(-687.8140, grad_fn=<AddBackward0>)\n",
      "20\n",
      "tensor(-754.1718, grad_fn=<AddBackward0>)\n",
      "21\n",
      "tensor(-761.2214, grad_fn=<AddBackward0>)\n",
      "22\n",
      "tensor(-791.6375, grad_fn=<AddBackward0>)\n",
      "23\n",
      "tensor(-760.5427, grad_fn=<AddBackward0>)\n",
      "24\n",
      "tensor(-781.7861, grad_fn=<AddBackward0>)\n",
      "25\n",
      "tensor(-763.0573, grad_fn=<AddBackward0>)\n",
      "26\n",
      "tensor(-768.5732, grad_fn=<AddBackward0>)\n",
      "27\n",
      "tensor(-781.4454, grad_fn=<AddBackward0>)\n",
      "28\n",
      "tensor(-783.0966, grad_fn=<AddBackward0>)\n",
      "29\n",
      "tensor(-778.1196, grad_fn=<AddBackward0>)\n",
      "30\n",
      "tensor(-793.5381, grad_fn=<AddBackward0>)\n",
      "31\n",
      "tensor(-767.8543, grad_fn=<AddBackward0>)\n",
      "32\n",
      "tensor(-790.7767, grad_fn=<AddBackward0>)\n",
      "33\n",
      "tensor(-788.3767, grad_fn=<AddBackward0>)\n",
      "34\n",
      "tensor(-785.9404, grad_fn=<AddBackward0>)\n",
      "35\n",
      "tensor(-784.8612, grad_fn=<AddBackward0>)\n",
      "36\n",
      "tensor(-772.5112, grad_fn=<AddBackward0>)\n",
      "37\n",
      "tensor(-791.3049, grad_fn=<AddBackward0>)\n",
      "38\n",
      "tensor(-764.4041, grad_fn=<AddBackward0>)\n",
      "39\n",
      "tensor(-799.1600, grad_fn=<AddBackward0>)\n",
      "40\n",
      "tensor(-776.9543, grad_fn=<AddBackward0>)\n",
      "41\n",
      "tensor(-721.0907, grad_fn=<AddBackward0>)\n",
      "42\n",
      "tensor(-751.7083, grad_fn=<AddBackward0>)\n",
      "43\n",
      "tensor(-753.9623, grad_fn=<AddBackward0>)\n",
      "44\n",
      "tensor(-749.0261, grad_fn=<AddBackward0>)\n",
      "45\n",
      "tensor(-780.6027, grad_fn=<AddBackward0>)\n",
      "46\n",
      "tensor(-758.3283, grad_fn=<AddBackward0>)\n",
      "47\n",
      "tensor(-769.9341, grad_fn=<AddBackward0>)\n",
      "48\n",
      "tensor(-777.0524, grad_fn=<AddBackward0>)\n",
      "49\n",
      "tensor(-777.1433, grad_fn=<AddBackward0>)\n",
      "50\n",
      "tensor(-782.1246, grad_fn=<AddBackward0>)\n",
      "51\n",
      "tensor(-769.9158, grad_fn=<AddBackward0>)\n",
      "52\n",
      "tensor(-787.8535, grad_fn=<AddBackward0>)\n",
      "53\n",
      "tensor(-784.9601, grad_fn=<AddBackward0>)\n",
      "54\n",
      "tensor(-786.4537, grad_fn=<AddBackward0>)\n",
      "55\n",
      "tensor(-783.7056, grad_fn=<AddBackward0>)\n",
      "56\n",
      "tensor(-794.9970, grad_fn=<AddBackward0>)\n",
      "57\n",
      "tensor(-795.1586, grad_fn=<AddBackward0>)\n",
      "58\n",
      "tensor(-785.6384, grad_fn=<AddBackward0>)\n",
      "59\n",
      "tensor(-790.7515, grad_fn=<AddBackward0>)\n",
      "60\n",
      "tensor(-781.2505, grad_fn=<AddBackward0>)\n",
      "61\n",
      "tensor(-788.7219, grad_fn=<AddBackward0>)\n",
      "62\n",
      "tensor(-790.5394, grad_fn=<AddBackward0>)\n",
      "63\n",
      "tensor(-775.8477, grad_fn=<AddBackward0>)\n",
      "64\n",
      "tensor(-784.5693, grad_fn=<AddBackward0>)\n",
      "65\n",
      "tensor(-779.9819, grad_fn=<AddBackward0>)\n",
      "66\n",
      "tensor(-784.6932, grad_fn=<AddBackward0>)\n",
      "67\n",
      "tensor(-786.7704, grad_fn=<AddBackward0>)\n",
      "68\n",
      "tensor(-784.3763, grad_fn=<AddBackward0>)\n",
      "69\n",
      "tensor(-802.7597, grad_fn=<AddBackward0>)\n",
      "70\n",
      "tensor(-797.9884, grad_fn=<AddBackward0>)\n",
      "71\n",
      "tensor(-794.7910, grad_fn=<AddBackward0>)\n",
      "72\n",
      "tensor(-789.5491, grad_fn=<AddBackward0>)\n",
      "73\n",
      "tensor(-812.8241, grad_fn=<AddBackward0>)\n",
      "74\n",
      "tensor(-806.0380, grad_fn=<AddBackward0>)\n",
      "75\n",
      "tensor(-795.7842, grad_fn=<AddBackward0>)\n",
      "76\n",
      "tensor(-795.0843, grad_fn=<AddBackward0>)\n",
      "77\n",
      "tensor(-799.3398, grad_fn=<AddBackward0>)\n",
      "78\n",
      "tensor(-803.4544, grad_fn=<AddBackward0>)\n",
      "79\n",
      "tensor(-798.3621, grad_fn=<AddBackward0>)\n",
      "80\n",
      "tensor(-801.5742, grad_fn=<AddBackward0>)\n",
      "81\n",
      "tensor(-811.7514, grad_fn=<AddBackward0>)\n",
      "82\n",
      "tensor(-805.2972, grad_fn=<AddBackward0>)\n",
      "83\n",
      "tensor(-808.5695, grad_fn=<AddBackward0>)\n",
      "84\n",
      "tensor(-802.5878, grad_fn=<AddBackward0>)\n",
      "85\n",
      "tensor(-801.1466, grad_fn=<AddBackward0>)\n",
      "86\n",
      "tensor(-804.5682, grad_fn=<AddBackward0>)\n",
      "87\n",
      "tensor(-806.6592, grad_fn=<AddBackward0>)\n",
      "88\n",
      "tensor(-804.7198, grad_fn=<AddBackward0>)\n",
      "89\n",
      "tensor(-803.9422, grad_fn=<AddBackward0>)\n",
      "90\n",
      "tensor(-804.1366, grad_fn=<AddBackward0>)\n",
      "91\n",
      "tensor(-796.2500, grad_fn=<AddBackward0>)\n",
      "92\n",
      "tensor(-795.0413, grad_fn=<AddBackward0>)\n",
      "93\n",
      "tensor(-792.8060, grad_fn=<AddBackward0>)\n",
      "94\n",
      "tensor(-792.8692, grad_fn=<AddBackward0>)\n",
      "95\n",
      "tensor(-803.2399, grad_fn=<AddBackward0>)\n",
      "96\n",
      "tensor(-794.1744, grad_fn=<AddBackward0>)\n",
      "97\n",
      "tensor(-794.5501, grad_fn=<AddBackward0>)\n",
      "98\n",
      "tensor(-796.7631, grad_fn=<AddBackward0>)\n",
      "99\n",
      "tensor(-805.6681, grad_fn=<AddBackward0>)\n"
     ]
    }
   ],
   "source": [
    "ag._policy_optimizer=Adam(params=ag._policy.parameters(),lr=1e-6)\n",
    "\n",
    "for i in range(100):\n",
    "    print(i)\n",
    "    r_sum=torch.tensor(0.0)\n",
    "    for j in range(1000):\n",
    "        #ag.calculate_FIM()\n",
    "        ag._s=torch.rand(4)\n",
    "        ag._p_T=torch.rand(3)\n",
    "        action=ag.plan(ag._s,ag._p_b,ag._p_T,ag._p_f_W)\n",
    "\n",
    "        #rk4\n",
    "        dt=10.0\n",
    "        x=ag._s\n",
    "        xdot=torch.hstack([ag._s[2:],action])\n",
    "\n",
    "        k1=xdot\n",
    "        k2=xdot+torch.hstack([k1[2:]*dt/2,torch.zeros(2)])\n",
    "        k3=xdot+torch.hstack([k2[2:]*dt/2,torch.zeros(2)])\n",
    "        k4=xdot+torch.hstack([k3[2:]*dt,torch.zeros(2)])\n",
    "        ag._s=ag._s+(k1+2*k2+2*k3+k4)*dt/6\n",
    "\n",
    "        ag.update_rotation_matrix()\n",
    "        \n",
    "        v=(ag.calculate_target_visiblity())\n",
    "        #r=torch.norm(action)\n",
    "        r=torch.log10(1-v)\n",
    "        r.backward()\n",
    "        ag._policy_optimizer.step()\n",
    "        \n",
    "        r_sum+=-v\n",
    "    print(r_sum)\n",
    "    r_list.append(r_sum)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/tmp/ipykernel_5180/2653646084.py:3: DeprecationWarning: `np.float` is a deprecated alias for the builtin `float`. To silence this warning, use `float` by itself. Doing this will not modify any behavior and is safe. If you specifically wanted the numpy scalar type, use `np.float64` here.\n",
      "Deprecated in NumPy 1.20; for more details and guidance: https://numpy.org/devdocs/release/1.20.0-notes.html#deprecations\n",
      "  r_np_list.append(np.float(r_list[i]))\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x7fa3455dfb80>]"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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Mb+fn1+Rfdz5GPbo0eOK9ZlMJt1zzz22fVzpGH733Xe69957VatWLZlMJn3++ee/e5uEhAS1a9dOvr6+atiwoWbPnn3FPiX9unaUkq5vyZIluv322xUSEqLAwEBFR0frm2++KbLPs88+e8Xxa9q0qQNXcX0lXWNCQsJVP0cLfw9fIXc9hlf7+jKZTGrevLltH1c6hpMmTVLHjh0VEBCg6tWrKzY2Vrt27frd2zn7uZCYsfPJJ5/oySef1MSJE7V582a1bt1avXv31smTJ6+6/7p169S/f38NGzZMKSkpio2NVWxsrLZt22bb55VXXtHbb7+t999/X8nJyfL391fv3r2VlZVVVsuyKen6EhIS1L9/f61evVqJiYkKCwvTHXfcoaNHjxbZ784779SxY8ds2/z588tiOVdV0jVKBT+10n7+gwcPFrnenY/hkiVLiqxt27Ztslgs+vOf/1xkP1c5hhcuXFDr1q01derUYu2/f/9+3XPPPerZs6e2bNmiMWPGaPjw4UWe8G/kc8JRSrq+7777Trfffru+/PJLbdq0ST179tS9996rlJSUIvs1b968yPFbu3atI8YvlpKusdCuXbuKrKF69eq269z5GL711ltF1nX48GFVqVLliq9BVzmGa9as0ahRo5SUlKRvv/1Wubm5uuOOO3ThwoVr3sYlnguL/dsay4FOnToZo0aNsn2cn59v1KpVy5g0adJV93/wwQeNe+65p8hlkZGRxqOPPmoYhmFYrVajZs2axquvvmq7/ty5c4avr68xf/58B6zg+kq6vt/Ky8szAgICjDlz5tguGzJkiHHfffeV9qg3rKRr/OCDD4ygoKBr3p+nHcMpU6YYAQEBxvnz522XudoxLCTJ+Oyzz667zz//+U+jefPmRS7r27ev0bt3b9vHN/t35ijFWd/V3HLLLcZzzz1n+3jixIlG69atS2+wUlScNa5evdqQZPzyyy/X3MeTjuFnn31mmEwm48CBA7bLXPkYnjx50pBkrFmz5pr7uMJzIa/MXJaTk6NNmzYpJibGdpnZbFZMTIwSExOvepvExMQi+0tS7969bfvv379fx48fL7JPUFCQIiMjr3mfjnIj6/utixcvKjc3V1WqVClyeUJCgqpXr64mTZroscce05kzZ0p19uK60TWeP39e9erVU1hYmO677z5t377ddp2nHcOZM2eqX79+8vf3L3K5qxzDkvq9r8HS+DtzJVarVZmZmVd8De7Zs0e1atVSeHi4HnroIR06dMhJE964Nm3aKDQ0VLfffrt++OEH2+WedgxnzpypmJgY1atXr8jlrnoM09PTJemKzzl7rvBcSMxcdvr0aeXn56tGjRpFLq9Ro8YV790WOn78+HX3L/xvSe7TUW5kfb81btw41apVq8gn5J133qkPP/xQK1eu1OTJk7VmzRrdddddys/PL9X5i+NG1tikSRPNmjVL8fHx+vjjj2W1WtW5c2cdOXJEkmcdw/Xr12vbtm0aPnx4kctd6RiW1LW+BjMyMnTp0qVS+bx3Ja+99prOnz+vBx980HZZZGSkZs+era+//lrvvfee9u/fr65duyozM9OJkxZfaGio3n//fS1evFiLFy9WWFiYevTooc2bN0sqnX+7XEVaWpq++uqrK74GXfUYWq1WjRkzRrfeeqtatGhxzf1c4bmwXPzWbNy8l19+WQsWLFBCQkKRE2T79etn+3PLli3VqlUrRUREKCEhQb169XLGqCUSHR2t6Oho28edO3dWs2bNNG3aNL3wwgtOnKz0zZw5Uy1btlSnTp2KXO7ux7C8mDdvnp577jnFx8cXOZ/krrvusv25VatWioyMVL169bRw4UINGzbMGaOWSJMmTdSkSRPbx507d1ZqaqqmTJmijz76yImTlb45c+YoODhYsbGxRS531WM4atQobdu2zannYBUXr8xcVq1aNVksFp04caLI5SdOnFDNmjWvepuaNWted//C/5bkPh3lRtZX6LXXXtPLL7+s5cuXq1WrVtfdNzw8XNWqVdPevXtveuaSupk1FvL29lbbtm1t83vKMbxw4YIWLFhQrH8YnXkMS+paX4OBgYGqUKFCqXxOuIIFCxZo+PDhWrhw4RUv5/9WcHCwGjdu7BbH71o6depkm99TjqFhGJo1a5YGDRokHx+f6+7rCsfw8ccf1xdffKHVq1erTp06193XFZ4LiZnLfHx81L59e61cudJ2mdVq1cqVK4v8n7u96OjoIvtL0rfffmvbv0GDBqpZs2aRfTIyMpScnHzN+3SUG1mfVHAG+gsvvKCvv/5aHTp0+N3HOXLkiM6cOaPQ0NBSmbskbnSN9vLz87V161bb/J5wDKWCb5vMzs7WwIEDf/dxnHkMS+r3vgZL43PC2ebPn6+HH35Y8+fPL/It9ddy/vx5paamusXxu5YtW7bY5veEYygVfJfQ3r17i/U/FM48hoZh6PHHH9dnn32mVatWqUGDBr97G5d4LiyV04g9xIIFCwxfX19j9uzZxs8//2yMHDnSCA4ONo4fP24YhmEMGjTIGD9+vG3/H374wfDy8jJee+01Y8eOHcbEiRMNb29vY+vWrbZ9Xn75ZSM4ONiIj483fvrpJ+O+++4zGjRoYFy6dMnl1/fyyy8bPj4+xqeffmocO3bMtmVmZhqGYRiZmZnGP/7xDyMxMdHYv3+/sWLFCqNdu3ZGo0aNjKysrDJf342s8bnnnjO++eYbIzU11di0aZPRr18/w8/Pz9i+fbttH3c+hoW6dOli9O3b94rLXe0YZmZmGikpKUZKSoohyXjjjTeMlJQU4+DBg4ZhGMb48eONQYMG2fbft2+fUbFiRWPs2LHGjh07jKlTpxoWi8X4+uuvbfv83t+ZK69v7ty5hpeXlzF16tQiX4Pnzp2z7fPUU08ZCQkJxv79+40ffvjBiImJMapVq2acPHmyzNdnGCVf45QpU4zPP//c2LNnj7F161Zj9OjRhtlsNlasWGHbx52PYaGBAwcakZGRV71PVzqGjz32mBEUFGQkJCQU+Zy7ePGibR9XfC4kZn7jv//9r1G3bl3Dx8fH6NSpk5GUlGS7rnv37saQIUOK7L9w4UKjcePGho+Pj9G8eXNj2bJlRa63Wq3GhAkTjBo1ahi+vr5Gr169jF27dpXFUq6qJOurV6+eIemKbeLEiYZhGMbFixeNO+64wwgJCTG8vb2NevXqGSNGjHDKPzD2SrLGMWPG2PatUaOGcffddxubN28ucn/ufAwNwzB27txpSDKWL19+xX252jEs/Dbd326FaxoyZIjRvXv3K27Tpk0bw8fHxwgPDzc++OCDK+73en9nZamk6+vevft19zeMgm9FDw0NNXx8fIzatWsbffv2Nfbu3Vu2C7NT0jVOnjzZiIiIMPz8/IwqVaoYPXr0MFatWnXF/brrMTSMgm9DrlChghEXF3fV+3SlY3i1tUkq8nXlis+FpsvDAwAAuCXOmQEAAG6NmAEAAG6NmAEAAG6NmAEAAG6NmAEAAG6NmAEAAG6NmAEAAG6NmAEAAG6NmAEAAG6NmAEAAG6NmAEAAG6NmAEAAG7t/wFpKrEmrC6xcQAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "r_np_list=[]\n",
    "for i in range(len(r_list)):\n",
    "    r_np_list.append(np.float(r_list[i]))\n",
    "    \n",
    "plt.plot(r_np_list)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x7f6d9c5412b0>"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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sWNH1Gq5YIPRaGT+/Pm0bt2agQMHVmmfqxk2bBgHDhxg6dKl9O3bl6VLlwJw6tQphgwZQseOHQkNDeWJJ56goKCA/Px8OnfujEKhoEuXLkRFRQEwevRoXF1deeSRR8p97efPn8fPz69YbF/dunXJzc21J1PesmULHTt2LNamc+fObNmy5ZpjL168mODgYHr27Mn06dPJzc0t0eavv/6iS5cu9OzZkx49evDFF18UO757927CwsLo2LEjQ4YM4aOPPkKhUNC3b197zb4bgW0lrW1yo/bzQ+niAhYL7QyylbmEMgXQ6UH5/ehqyEsrcfjloa3RqpVEnkpl49Gk6hFecNNT6XIyAsHNwK7Tqfxurb/3+og2pVeF/+9r+b3jFFAVvzVs8VKtvFthPiYHn9tiMmzKlPpGWKYkCYx51X+e0tC4FAvIvxY///wzs2fPZujQoRiNRoYPH867777LK6+8AkBiYiITJky45hhTp04t4XZ6/PHHWb58OW3atGHjxo0Oudwq0sfGunXr6Nu3L3379uW1114DQK/XM3jwYKZPn87s2bMxGAwMGjSIp59+mi+//JJdu3ZRt25dHnroITp27AjAggULeOSRR/jyyy8BmDdvHhs2bLjmubdt2wZAUFAQly9fxmg0otHI1tSEhAQALl6Uv4tnz56la9euxfoHBgaSmZlJWloa3t7eJcbfvXs3//vf/9i1axddunThzJkz9OzZs1jKm6NHjzJ27Fh27dpFWFgYqamphIeH4+npycSJE8nJyWH48OHMmjWL//u//yMvL48BAwYUk/9GobamNzEbLUiShEKhQNO4MfrYWJparcmn0k9RYCrASV0kQW/9DhAYComH5RJS3R8vNm4jHxce7hXMon9O88bao/Rq7ourTvx0CoojvhGCWx69ycxLa+QZ6eSujQlr6FWyUdIxOL9LDjzvcH+JwzZlqq1vWwzx8lj2mAyDHAis1t6AlCHGPHi7XvWfpzRmXwKtY8l5P/roI3vBc41Gw6hRo1i6dKldmQoMDKzQj+2nn37KggULePXVV4mIiGDPnj3UrVu3yvtcixUrVnDp0iWeeeYZALRaLc888wxjx47ljTfeICAggPHjx7Ns2TIeeughAJYvX869995rH2PmzJnMnDnTofNNmTKFt956i/nz5zNr1ixSUlJYvHgxgD0IPS8vD51OV6yf7XNe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",
      "text/plain": [
       "<Figure size 670x330 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import torch\n",
    "fig = plt.figure(figsize=(6.7, 3.3)) \n",
    "plt.rcParams['font.family'] = 'DeJavu Serif'\n",
    "plt.rcParams['font.serif'] = ['Times New Roman']\n",
    "\n",
    "b_deg=torch.arange(-190,190,0.1)\n",
    "b_rad=torch.deg2rad(b_deg)\n",
    "\n",
    "ag._fov=torch.pi\n",
    "\n",
    "b_rad=b_rad\n",
    "\n",
    "v_1=[]\n",
    "for b in b_rad:\n",
    "    v_1.append(ag.calculate_visibility(1.3,b))\n",
    "plt.plot(b_deg,v_1)\n",
    "v_2=[]\n",
    "for b in b_rad:\n",
    "    v_2.append(ag.calculate_visibility(3.3,b))\n",
    "plt.plot(b_deg,v_2)\n",
    "v_2=[]\n",
    "for b in b_rad:\n",
    "    v_2.append(ag.calculate_visibility(6.7,b))\n",
    "plt.plot(b_deg,v_2)\n",
    "v_2=[]\n",
    "for b in b_rad:\n",
    "    v_2.append(ag.calculate_visibility(10.,b))\n",
    "plt.plot(b_deg,v_2)\n",
    "v_2=[]\n",
    "for b in b_rad:\n",
    "    v_2.append(ag.calculate_visibility(44.,b))\n",
    "plt.plot(b_deg,v_2)\n",
    "\n",
    "plt.xlabel('Bearing angle (deg)', fontsize=12)\n",
    "plt.ylabel('Visibility', fontsize=12)\n",
    "\n",
    "plt.legend(['a=1.3, fov=90 deg','a=3.3, fov=90 deg','a=6.7, fov=90 deg','a=10., fov=90 deg','a=44., fov=90 deg'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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cFx0TpaPP/7YpFQiIiLiLJymtAQEBJCXl2d2DBEREXFSOtmIiIiIuASVFhEREXEJKi0iIiLiElRaRERExCWotIiIiIhLUGkRERERl6DSIiIiIi5BpUVERERcgkqLiIiIuASnOSPutTIMA/jrEtciIiLiGs5/b5//Hr8StyktGRkZAISHh5ucRERERAorIyODoKCgK05jMQpSbVyAw+EgKSmJgIAALBZLsb52eno64eHhHDlyhMDAwGJ9bWeg+XN97j6P7j5/4P7zqPlzfSU1j4ZhkJGRQVhYGFbrlfdacZstLVarlerVq5foewQGBrrtHyNo/tyBu8+ju88fuP88av5cX0nM49W2sJynHXFFRETEJai0iIiIiEtQaSkAHx8fJkyYgI+Pj9lRSoTmz/W5+zy6+/yB+8+j5s/1OcM8us2OuCIiIuLetKVFREREXIJKi4iIiLgElRYRERFxCSotgN1u55lnnsHT05NDhw5ddfp169bRtm1bOnXqRNu2bVm7dm3Jh7xGhZnH2bNnExERQUxMzAU/dru9dMIW0oIFC7j55pvp0qULrVu3pl+/fledx4ULF9K6dWtuvPFGOnXqxI4dO0onbBEVdh5ffPFFoqKiLlh+d9xxR+kFLoTFixdzyy230KVLFzp06EDLli357LPPrvo8V1qGRZlHV1qGfzdjxgwsFgurV6++4nSuuB49ryDz6Grr0aL8vZnyGTTKuMTERKNt27bGoEGDDMBITEy84vSHDh0yAgMDjTVr1hiGYRirV682AgMDjUOHDpVC2qIp7Dx+/PHHxscff1wq2YqDl5eX8f333xuGYRh5eXnG/fffbzRs2NDIzs6+5PQbNmwwAgICjL179xqGYRixsbFGtWrVjPT09FLLXFiFnccJEyYYq1atKsWERde9e3cjNjY2//aSJUsMi8VibN269bLPcbVlWJR5dKVleN6xY8eMGjVqGMAVs7vievS8gs6jq61HC/v3ZtZnsMxvaTl79ixz587lgQceKND0b775Jo0bN+bGG28EoFOnTjRs2JC33nqrJGNek8LOo6vp06cP3bt3B/46M/Ljjz/Onj17SEhIuOT0U6ZM4bbbbqN+/foADBw4kNzcXGbPnl1akQutsPPoSiZNmsSAAQPyb8fExGAYBgcPHrzsc1xtGRZlHl3RqFGjePbZZ686nSuuR88r6Dy6O7M+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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import matplotlib.font_manager as fm\n",
    "\n",
    "# 设置所需的字体\n",
    "plt.rcParams['font.family'] = 'DeJavu Serif'\n",
    "plt.rcParams['font.serif'] = ['Times New Roman']\n",
    "\n",
    "# 定义数据\n",
    "x = [1, 2, 3, 4, 5]\n",
    "y = [2, 3, 5, 7, 6]\n",
    "\n",
    "# 绘制图形\n",
    "plt.plot(x, y, label='Line')\n",
    "plt.xlabel('X-axis', fontsize=12)\n",
    "plt.ylabel('Y-axis', fontsize=12)\n",
    "plt.legend()\n",
    "\n",
    "# 显示图形\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor(0.)"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "t=torch.tensor(1.0)\n",
    "\n",
    "cost=torch.cos(t)\n",
    "\n",
    "torch.acos(t)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tensor([[ 0.7071, -0.7071,  0.0000],\n",
      "        [ 0.7071,  0.7071,  0.0000],\n",
      "        [ 0.0000,  0.0000,  1.0000]])\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "tensor([[0.1180, 0.1721, 0.3802, 0.3935, 0.3279, 0.0749, 0.1622, 0.8790, 0.4314,\n",
       "         0.0962, 0.8393, 0.2888, 0.8868, 0.0929, 0.5626, 0.9115, 0.5183, 0.8283,\n",
       "         0.4022, 0.0846, 0.6983, 0.3926, 0.2236, 0.7869, 0.7609, 0.3888, 0.8009,\n",
       "         0.7083, 0.1629, 0.2744, 0.4643, 0.7099, 0.1302, 0.6949, 0.3218, 0.8102,\n",
       "         0.8071, 0.4377, 0.5393, 0.2808, 0.3046, 0.8671, 0.8939, 0.2401, 0.7308,\n",
       "         0.8179, 0.3163, 0.2882, 0.1377, 0.2872, 0.9626, 0.8292, 0.5549, 0.5156,\n",
       "         0.8424, 0.6855, 0.6182, 0.3161, 0.2241, 0.1830, 0.8877, 0.1955, 0.4784,\n",
       "         0.9247, 0.9280, 0.6507, 0.5121, 0.7575, 0.5864, 0.0471, 0.5795, 0.3655,\n",
       "         0.4100, 0.2132, 0.6934, 0.4782, 0.9490, 0.8557, 0.9244, 0.9766, 0.5664,\n",
       "         0.5392, 0.8728, 0.9119, 0.5691, 0.1953, 0.3118, 0.0044, 0.4661, 0.1349,\n",
       "         0.3802, 0.7962, 0.2235, 0.9879, 0.3999, 0.1259, 0.2526, 0.3945, 0.9491,\n",
       "         0.3546, 0.7972, 0.2044, 0.4362, 0.9789, 0.2133, 0.8900, 0.8973, 0.8447,\n",
       "         0.1296, 0.0342, 0.2236, 0.7656, 0.4928, 0.6797, 0.3928, 0.2146, 0.4909,\n",
       "         0.7193, 0.5143, 0.5955, 0.5086, 0.4124, 0.8363, 0.4627, 0.9865, 0.8003,\n",
       "         0.9192, 0.8075],\n",
       "        [0.3969, 0.7909, 0.5715, 0.7199, 0.6882, 0.7705, 0.4386, 0.8210, 0.1384,\n",
       "         0.8284, 0.7548, 0.5500, 0.6618, 0.1329, 0.8832, 0.3459, 0.8080, 0.0168,\n",
       "         0.4586, 0.2853, 0.1453, 0.7612, 0.0302, 0.9818, 0.4485, 0.8699, 0.3091,\n",
       "         0.9404, 0.2559, 0.7120, 0.8356, 0.5297, 0.8676, 0.5331, 0.4298, 0.4563,\n",
       "         0.6463, 0.7462, 0.6158, 0.9997, 0.0129, 0.2733, 0.7841, 0.3581, 0.2324,\n",
       "         0.8219, 0.5503, 0.8007, 0.7137, 0.1979, 0.9729, 0.5174, 0.7815, 0.0053,\n",
       "         0.0686, 0.7952, 0.2385, 0.5194, 0.7822, 0.9128, 0.1104, 0.0896, 0.1362,\n",
       "         0.6106, 0.4974, 0.7149, 0.5982, 0.7621, 0.2548, 0.6909, 0.9505, 0.7167,\n",
       "         0.8053, 0.3731, 0.6707, 0.4988, 0.8230, 0.8295, 0.7835, 0.3139, 0.9280,\n",
       "         0.0165, 0.6102, 0.1246, 0.0112, 0.5901, 0.4960, 0.9688, 0.9341, 0.1707,\n",
       "         0.9403, 0.8743, 0.6446, 0.6769, 0.1315, 0.6057, 0.4476, 0.7923, 0.5800,\n",
       "         0.3793, 0.2600, 0.4070, 0.7380, 0.8336, 0.1521, 0.7140, 0.4600, 0.9750,\n",
       "         0.7086, 0.4038, 0.1091, 0.2372, 0.8513, 0.5409, 0.4000, 0.2835, 0.6646,\n",
       "         0.2842, 0.1831, 0.1662, 0.9932, 0.4293, 0.0239, 0.1779, 0.0874, 0.6276,\n",
       "         0.0032, 0.0696],\n",
       "        [0.5234, 0.1756, 0.1351, 0.4341, 0.7382, 0.6833, 0.4725, 0.3965, 0.0894,\n",
       "         0.9243, 0.6855, 0.5762, 0.7330, 0.5304, 0.4752, 0.5887, 0.8117, 0.1429,\n",
       "         0.6419, 0.5669, 0.0248, 0.2839, 0.4254, 0.7244, 0.9177, 0.0370, 0.5776,\n",
       "         0.5900, 0.8387, 0.9548, 0.6529, 0.4247, 0.4543, 0.3457, 0.5606, 0.9783,\n",
       "         0.4593, 0.7933, 0.0247, 0.8676, 0.7576, 0.6415, 0.1462, 0.9114, 0.6780,\n",
       "         0.9581, 0.9955, 0.0766, 0.6841, 0.8685, 0.0040, 0.3537, 0.9520, 0.9763,\n",
       "         0.5593, 0.4724, 0.3380, 0.6332, 0.8538, 0.8945, 0.8907, 0.5255, 0.8646,\n",
       "         0.8062, 0.4291, 0.0572, 0.5981, 0.7329, 0.7212, 0.5761, 0.4356, 0.6802,\n",
       "         0.4943, 0.1539, 0.2883, 0.0254, 0.9209, 0.3838, 0.0439, 0.9601, 0.4991,\n",
       "         0.7792, 0.1480, 0.5005, 0.0384, 0.5364, 0.1463, 0.1908, 0.6777, 0.4747,\n",
       "         0.5079, 0.1309, 0.3638, 0.0842, 0.5868, 0.7586, 0.9777, 0.5855, 0.0682,\n",
       "         0.4165, 0.1936, 0.8478, 0.8216, 0.8723, 0.1789, 0.9546, 0.7105, 0.8889,\n",
       "         0.8889, 0.1583, 0.1285, 0.8236, 0.2366, 0.5087, 0.2255, 0.6663, 0.7054,\n",
       "         0.3692, 0.1485, 0.7111, 0.4829, 0.0971, 0.4911, 0.1957, 0.3190, 0.9114,\n",
       "         0.7524, 0.8567]])"
      ]
     },
     "execution_count": 179,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import torch\n",
    "\n",
    "def rodrigues_rotation(v1, v2):\n",
    "    # Normalize the input vectors\n",
    "    v1 = v1 / torch.norm(v1)\n",
    "    v2 = v2 / torch.norm(v2)\n",
    "    \n",
    "    # Compute the cross product of the vectors\n",
    "    k = torch.cross(v1, v2)\n",
    "\n",
    "    # Compute the cosine of the angle between the vectors\n",
    "    cos_theta = torch.dot(v1, v2)\n",
    "\n",
    "    # Compute the sine of the angle between the vectors\n",
    "    sin_theta = torch.norm(k)\n",
    "\n",
    "    # Compute the skew-symmetric matrix using the cross product vector\n",
    "    kx = torch.tensor([[0, -k[2], k[1]],\n",
    "                      [k[2], 0, -k[0]],\n",
    "                      [-k[1], k[0], 0]])\n",
    "\n",
    "    # Compute the rotation matrix using Rodrigues' rotation formula\n",
    "    R = torch.eye(3) + kx + torch.mm(kx, kx) * ((1 - cos_theta) / sin_theta**2) if sin_theta != 0 else torch.eye(3)\n",
    "\n",
    "    return R\n",
    "\n",
    "# Example usage\n",
    "v1 = torch.tensor([1., 0., 0.])  # The initial 3D vector\n",
    "v2 = torch.tensor([1., 1., 0.])  # The final 3D vector\n",
    "R = rodrigues_rotation(v1, v2)    # Calculate the rotation matrix\n",
    "\n",
    "print(R)  # Print the rotation matrix\n",
    "\n",
    "\n",
    "\n",
    "p_f=torch.rand([3,128])\n",
    "p_f_b="
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.10"
  },
  "orig_nbformat": 4
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
